#ifndef CTL_HASHMAP_DECL_H_
#define CTL_HASHMAP_DECL_H_

#include "hashset_decl.h"

#define DECL_HASHMAP(KTYPE, VTYPE, HASH, EQ) \
DECL_HASHSET(ctl_pair_##KTYPE##_##VTYPE, HASH, EQ) \
typedef ctl_hashset_ctl_pair_##KTYPE##_##VTYPE##_##HASH##_##EQ  ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ; \
typedef ctl_hashset_ctl_pair_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter  ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter; \
typedef ctl_res_ctl_hashset_ctl_pair_##KTYPE##_##VTYPE##_##HASH##_##EQ##_p ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_p; \
typedef ctl_res_ctl_hashset_ctl_pair_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter  ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter; \
ctl_res_ctl_pair_##KTYPE##_##VTYPE ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter_data(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter iter); \
ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter_next(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter iter); \
ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_begin(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht); \
size_t ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_size(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_ctor_with_capacity(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht, size_t capacity); \
ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_p ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_new_with_capacity(size_t capacity); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_ctor(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht); \
ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_p ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_new(); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_dtor(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_free(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_copy(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* dst, ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* src); \
ctl_res_ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_get(const ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht, KTYPE key); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_put(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht, KTYPE key); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_remove_by_iter(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht, ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_iter iter); \
ctl_res_void ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ##_remove(ctl_hashmap_##KTYPE##_##VTYPE##_##HASH##_##EQ* ht, KTYPE key); \


#endif